/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.CambioDeRepuestos;
import entidades.RuedasReemplazadas;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author g
 */
public class RuedasReemplazadasJpaController implements Serializable {

    public RuedasReemplazadasJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(RuedasReemplazadas ruedasReemplazadas) {
        if (ruedasReemplazadas.getLs_cambios() == null) {
            ruedasReemplazadas.setLs_cambios(new ArrayList<CambioDeRepuestos>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<CambioDeRepuestos> attachedLs_cambios = new ArrayList<CambioDeRepuestos>();
            for (CambioDeRepuestos ls_cambiosCambioDeRepuestosToAttach : ruedasReemplazadas.getLs_cambios()) {
                ls_cambiosCambioDeRepuestosToAttach = em.getReference(ls_cambiosCambioDeRepuestosToAttach.getClass(), ls_cambiosCambioDeRepuestosToAttach.getId());
                attachedLs_cambios.add(ls_cambiosCambioDeRepuestosToAttach);
            }
            ruedasReemplazadas.setLs_cambios(attachedLs_cambios);
            em.persist(ruedasReemplazadas);
            for (CambioDeRepuestos ls_cambiosCambioDeRepuestos : ruedasReemplazadas.getLs_cambios()) {
                RuedasReemplazadas oldRuedasReemplazadasOfLs_cambiosCambioDeRepuestos = ls_cambiosCambioDeRepuestos.getRuedasReemplazadas();
                ls_cambiosCambioDeRepuestos.setRuedasReemplazadas(ruedasReemplazadas);
                ls_cambiosCambioDeRepuestos = em.merge(ls_cambiosCambioDeRepuestos);
                if (oldRuedasReemplazadasOfLs_cambiosCambioDeRepuestos != null) {
                    oldRuedasReemplazadasOfLs_cambiosCambioDeRepuestos.getLs_cambios().remove(ls_cambiosCambioDeRepuestos);
                    oldRuedasReemplazadasOfLs_cambiosCambioDeRepuestos = em.merge(oldRuedasReemplazadasOfLs_cambiosCambioDeRepuestos);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(RuedasReemplazadas ruedasReemplazadas) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            RuedasReemplazadas persistentRuedasReemplazadas = em.find(RuedasReemplazadas.class, ruedasReemplazadas.getId());
            List<CambioDeRepuestos> ls_cambiosOld = persistentRuedasReemplazadas.getLs_cambios();
            List<CambioDeRepuestos> ls_cambiosNew = ruedasReemplazadas.getLs_cambios();
            List<CambioDeRepuestos> attachedLs_cambiosNew = new ArrayList<CambioDeRepuestos>();
            for (CambioDeRepuestos ls_cambiosNewCambioDeRepuestosToAttach : ls_cambiosNew) {
                ls_cambiosNewCambioDeRepuestosToAttach = em.getReference(ls_cambiosNewCambioDeRepuestosToAttach.getClass(), ls_cambiosNewCambioDeRepuestosToAttach.getId());
                attachedLs_cambiosNew.add(ls_cambiosNewCambioDeRepuestosToAttach);
            }
            ls_cambiosNew = attachedLs_cambiosNew;
            ruedasReemplazadas.setLs_cambios(ls_cambiosNew);
            ruedasReemplazadas = em.merge(ruedasReemplazadas);
            for (CambioDeRepuestos ls_cambiosOldCambioDeRepuestos : ls_cambiosOld) {
                if (!ls_cambiosNew.contains(ls_cambiosOldCambioDeRepuestos)) {
                    ls_cambiosOldCambioDeRepuestos.setRuedasReemplazadas(null);
                    ls_cambiosOldCambioDeRepuestos = em.merge(ls_cambiosOldCambioDeRepuestos);
                }
            }
            for (CambioDeRepuestos ls_cambiosNewCambioDeRepuestos : ls_cambiosNew) {
                if (!ls_cambiosOld.contains(ls_cambiosNewCambioDeRepuestos)) {
                    RuedasReemplazadas oldRuedasReemplazadasOfLs_cambiosNewCambioDeRepuestos = ls_cambiosNewCambioDeRepuestos.getRuedasReemplazadas();
                    ls_cambiosNewCambioDeRepuestos.setRuedasReemplazadas(ruedasReemplazadas);
                    ls_cambiosNewCambioDeRepuestos = em.merge(ls_cambiosNewCambioDeRepuestos);
                    if (oldRuedasReemplazadasOfLs_cambiosNewCambioDeRepuestos != null && !oldRuedasReemplazadasOfLs_cambiosNewCambioDeRepuestos.equals(ruedasReemplazadas)) {
                        oldRuedasReemplazadasOfLs_cambiosNewCambioDeRepuestos.getLs_cambios().remove(ls_cambiosNewCambioDeRepuestos);
                        oldRuedasReemplazadasOfLs_cambiosNewCambioDeRepuestos = em.merge(oldRuedasReemplazadasOfLs_cambiosNewCambioDeRepuestos);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = ruedasReemplazadas.getId();
                if (findRuedasReemplazadas(id) == null) {
                    throw new NonexistentEntityException("The ruedasReemplazadas with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Long id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            RuedasReemplazadas ruedasReemplazadas;
            try {
                ruedasReemplazadas = em.getReference(RuedasReemplazadas.class, id);
                ruedasReemplazadas.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The ruedasReemplazadas with id " + id + " no longer exists.", enfe);
            }
            List<CambioDeRepuestos> ls_cambios = ruedasReemplazadas.getLs_cambios();
            for (CambioDeRepuestos ls_cambiosCambioDeRepuestos : ls_cambios) {
                ls_cambiosCambioDeRepuestos.setRuedasReemplazadas(null);
                ls_cambiosCambioDeRepuestos = em.merge(ls_cambiosCambioDeRepuestos);
            }
            em.remove(ruedasReemplazadas);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<RuedasReemplazadas> findRuedasReemplazadasEntities() {
        return findRuedasReemplazadasEntities(true, -1, -1);
    }

    public List<RuedasReemplazadas> findRuedasReemplazadasEntities(int maxResults, int firstResult) {
        return findRuedasReemplazadasEntities(false, maxResults, firstResult);
    }

    private List<RuedasReemplazadas> findRuedasReemplazadasEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(RuedasReemplazadas.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public RuedasReemplazadas findRuedasReemplazadas(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(RuedasReemplazadas.class, id);
        } finally {
            em.close();
        }
    }

    public int getRuedasReemplazadasCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<RuedasReemplazadas> rt = cq.from(RuedasReemplazadas.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
